// 首先很容易知道这题要求的是逆序对的数量
// 但是如何得到每个小孩子在交换时贡献了多少的逆序对
// 逆序对的本质：前面比后面大的，后面比前面小的
// 求前面比后面大的，只要用树状数组的方式动态求前面比当前数小的个数，然后再用总个数减去当前个数就可以了

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1000010;
int n, maxr;
int a[N], tree[N], ans[N];

int lowbit(int x) { return x & -x; }

int add(int x, int y)
{
    for(int i = x; i <= maxr; i += lowbit(i))
        tree[i] += y;
}

int query(int x)
{
    int num = 0;
    for(int i = x; i > 0; i -= lowbit(i))
        num += tree[i];
    return num;
}

LL get(int x)
{
    LL l = 1, r = ans[x];
    return (l + r) * ans[x] / 2;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> a[i], a[i]++; 
        maxr = max(maxr, a[i]);
    }// 树状数组初始下标一定要从1开始
    // 正向求已经出现的比当前数小的数的数量
    
    for(int i = 1; i <= n; ++i)
    {
        // cout << a[i] << ' ' << query(a[i]) << endl;
        ans[i] += i - 1 - query(a[i]);
        add(a[i], 1);
    }
    
    memset(tree, 0, sizeof tree);
    
    // 逆向求解比当前数小的数
    for(int i = n; i > 0; --i)
    {
        ans[i] += query(a[i] - 1);
        add(a[i], 1);
    }
    
    LL aans = 0;
    for(int i = 1; i <= n; ++i)
        aans += get(i);
    cout << aans << endl;
    // for(int i = 0; i <= maxr; ++i)
        // cout << ans[i] << ' ';
    // cout << endl
    return 0;
}